home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-08-10 | 34.0 KB | 1,222 lines | [TEXT/MPS ] |
- (*
- File: OCEMessaging.mod
-
- Contains: Apple Open Collaboration Environment Messaging Interfaces.
-
- Version: Technology: AOCE Toolbox 1.02
- Package: Universal Interfaces 2.1ß1 in “MPW Prerelease” on ETO #17
-
- Copyright: © 1984-1995 by Apple Computer, Inc.
- All rights reserved.
-
- Bugs?: If you find a problem with this file, use the Apple Bug Reporter
- stack. Include the file and version information (from above)
- in the problem description and send to:
- Internet: apple.bugs.applelink.apple.com
- AppleLink: APPLE.BUGS
-
- *)
-
- (*$TAGS-*)
- (*$CALLING PASCAL*)
- MODULE OCEMessaging;
-
- IMPORT SYSTEM, Types, Memory, Files, DigitalSignature, OCE, OCEAuthDir;
-
- (* $PUSH*)
- (* $ALIGN MAC68K*)
- (* $LibExport+*)
-
- CONST
- kIPMAnyPriority* = 0; (* FOR FILTER ONLY *)
- kIPMNormalPriority* = 1;
- kIPMLowPriority* = 2;
- kIPMHighPriority* = 3;
-
-
- TYPE
- IPMPriority* = Types.SignedByte;
-
-
- CONST
- kIPMAtMark* = 0;
- kIPMFromStart* = 1;
- kIPMFromLEOM* = 2;
- kIPMFromMark* = 3;
-
-
- TYPE
- IPMAccessMode* = INTEGER;
-
-
- CONST
- kIPMUpdateMsgBit* = 4;
- kIPMNewMsgBit* = 5;
- kIPMDeleteMsgBit* = 6;
-
- (* Values of IPMNotificationType *)
- kIPMUpdateMsgMask* = ASH(1,kIPMUpdateMsgBit);
- kIPMNewMsgMask* = ASH(1,kIPMNewMsgBit);
- kIPMDeleteMsgMask* = ASH(1,kIPMDeleteMsgBit);
-
-
- TYPE
- IPMNotificationType* = Types.SignedByte;
-
-
- CONST
- kIPMSenderRStringTag* = 0;
- kIPMSenderRecordIDTag* = 1;
-
-
- TYPE
- IPMSenderTag* = INTEGER;
-
-
- CONST
- kIPMFromDistListBit* = 0;
- kIPMDummyRecBit* = 1;
- kIPMFeedbackRecBit* = 2; (* should be redirected to feedback queue *)
- kIPMReporterRecBit* = 3; (* should be redirected to reporter original queue *)
- kIPMBCCRecBit* = 4; (* this recipient is blind to all recipients of message *)
-
- (* Values of OCERecipientOffsetFlags *)
- kIPMFromDistListMask* = ASH(1,kIPMFromDistListBit);
- kIPMDummyRecMask* = ASH(1,kIPMDummyRecBit);
- kIPMFeedbackRecMask* = ASH(1,kIPMFeedbackRecBit);
- kIPMReporterRecMask* = ASH(1,kIPMReporterRecBit);
- kIPMBCCRecMask* = ASH(1,kIPMBCCRecBit);
-
-
- TYPE
- OCERecipientOffsetFlags* = Types.SignedByte;
-
- OCECreatorType* = RECORD
- msgCreator*: Types.OSType;
- msgType*: Types.OSType;
- END;
-
-
- CONST
- kIPMTypeWildCard* = LONG("ipmw");
- kIPMFamilyUnspecified* = 0;
- kIPMFamilyWildCard* = $3F3F3F3F; (* '??POINTER TO
-
- * well known signature *)
- kIPMSignature* = LONG("ipms"); (* base type
-
- * well known message types *)
- kIPMReportNotify* = LONG("rptn"); (* routing feedback
-
- * well known message block types *)
- kIPMEnclosedMsgType* = LONG("emsg"); (* enclosed (nested) message *)
- kIPMReportInfo* = LONG("rpti"); (* recipient information *)
- kIPMDigitalSignature* = LONG("dsig");
-
- (* Values of IPMMsgFormat *)
- kIPMOSFormatType* = 1;
- kIPMStringFormatType* = 2;
-
-
- TYPE
- IPMMsgFormat* = INTEGER;
-
- IPMStringMsgType* = Types.Str32;
-
- TheType* = RECORD
- (*ΔΔ CASE INTEGER OF
- 0: ( *)
- END;
- TheTypeCreator* = RECORD(TheType)
- msgOSType*: OCECreatorType;
- (*ΔΔ );
- 1: ( *)
- END;
- TheTypeString* = RECORD(TheType)
- msgStrType*: IPMStringMsgType;
- (*ΔΔ );*)
- END;
-
- IPMMsgType* = RECORD
- format*: IPMMsgFormat; (* IPMMsgFormat*)
- theType*: TheType;
- END;
-
- (*
- Following are the known extension values for IPM addresses handled by Apple.
- We define the definition of the entn extension below.
- *)
-
- CONST
- kOCEalanXtn* = LONG("alan");
- kOCEentnXtn* = LONG("entn"); (* entn* = entity name (aka DSSpec) *)
- kOCEaphnXtn* = LONG("aphn");
-
- (*
- Following are the specific definitions for the extension for the standard
- OCEMail LONG("entn") addresses. [Note, the actual extension is formatted as in
- IPMEntityNameExtension.]
- *)
- (* entn extension forms *)
- kOCEAddrXtn* = LONG("addr");
- kOCEQnamXtn* = LONG("qnam");
- kOCEAttrXtn* = LONG("attr"); (* an attribute specification *)
- kOCESpAtXtn* = LONG("spat");
-
- (*
- Following are the specific definitions for standard
- OCEMail LONG("aphn") extension value.
-
- All RStrings here are packed (e.g. truncated to length) and even padded (e.g.
- if length odd, then a pad byte (zero) should be introduced before the next field).
-
- The extension value is in the packed form of the following structure*:
- RString phoneNumber;
- RString modemType;
- Types.Str32 queueuName;
-
- The body of phoneNumber compound RString is in the packed form of the following structure*:
- short subType;
- RString countryCode; // used when subType == kOCEUseHandyDial
- RString areaCode; // used when subType == kOCEUseHandyDial
- RString phone; // used when subType == kOCEUseHandyDial
- RString postFix; // used when subType == kOCEUseHandyDial
- RString nonHandyDialString; // used when subType == kOCEDontUseHandyDial
- *)
- (* phoneNumber sub type constants *)
- kOCEUseHandyDial* = 1;
- kOCEDontUseHandyDial* = 2;
-
- (* FORMAT OF A (*ΔΔPACKEDΔΔ*) FORM RECIPIENT *)
-
- TYPE
- ProtoOCEPackedRecipient* = RECORD
- dataLength*: INTEGER;
- END;
-
-
- CONST
- kOCEPackedRecipientMaxBytes* = 4096 - SIZE (*ΔΔ sizeof*)(ProtoOCEPackedRecipient);
-
-
- TYPE
- OCEPackedRecipient* = RECORD
- dataLength*: INTEGER;
- data*: ARRAY (*ΔΔ[0..*)kOCEPackedRecipientMaxBytes(*ΔΔ -1]ΔΔ*) OF Types.SInt8; (* Types.Byte *)
- END;
-
- IPMEntnQueueExtension* = RECORD
- queueName*: Types.Str32;
- END;
-
- (* kOCEAttrXtn *)
- IPMEntnAttributeExtension* = RECORD
- attributeName*: OCE.AttributeType;
- END;
-
- (* kOCESpAtXtn *)
- IPMEntnSpecificAttributeExtension* = RECORD
- attributeCreationID*: OCE.AttributeCreationID;
- attributeName*: OCE.AttributeType;
- END;
-
- (* All IPM entn extensions fit within the following *)
- IPMEntityNameExtension* = RECORD
- subExtensionType*: Types.OSType;
- (*ΔΔ CASE INTEGER OF
- 0: ( *)
- END;
- IPMENESpecificAttribute* = RECORD(IPMEntityNameExtension)
- specificAttribute*: IPMEntnSpecificAttributeExtension;
- (*ΔΔ );
- 1: ( *)
- END;
- IPMENEAttribute* = RECORD(IPMEntityNameExtension)
- attribute*: IPMEntnAttributeExtension;
- (*ΔΔ );
- 2: ( *)
- END;
- IPMENEQueue* = RECORD(IPMEntityNameExtension)
- queue*: IPMEntnQueueExtension;
- (*ΔΔ );*)
- END;
-
- (* addresses with kIPMNBPXtn should specify this nbp type *)
- IPMMsgID* = RECORD
- id*: ARRAY 4 (*ΔΔ[0..3]ΔΔ*) OF LONGINT;
- END;
-
- (* Values of IPMHeaderSelector *)
-
- CONST
- kIPMTOC* = 0;
- kIPMSender* = 1;
- kIPMProcessHint* = 2;
- kIPMMessageTitle* = 3;
- kIPMMessageType* = 4;
- kIPMFixedInfo* = 7;
-
-
- TYPE
- IPMHeaderSelector* = Types.Byte;
-
- TheSender* = RECORD
- (*ΔΔ CASE INTEGER OF
- 0: ( *)
- END;
- TheSenderString* = RECORD(TheSender)
- rString*: OCE.RString;
- (*ΔΔ );
- 1: ( *)
- END;
- TheSenderID* = RECORD(TheSender)
- rid*: OCE.PackedRecordID;
- (*ΔΔ );*)
- END;
-
- IPMSender* = RECORD
- sendTag*: IPMSenderTag;
- theSender*: TheSender;
- END;
-
- OCERecipient* = OCE.DSSpec;
-
- (******************************************************************************)
- (* Definitions specific to OCEMessaging *)
- IPMContextRef* = LONGINT;
-
- IPMQueueRef* = LONGINT;
-
- IPMMsgRef* = LONGINT;
-
- IPMSeqNum* = LONGINT;
-
- IPMProcHint* = Types.Str32;
-
- IPMQueueName* = Types.Str32;
-
- IPMNoteProcPtr* = (*ΔΔ Types.ProcPtr;*) PROCEDURE (queue: IPMQueueRef; seqNum: IPMSeqNum; notificationType: Types.ByteParameter; userData: LONGINT);
- IPMNoteUPP* = Types.UniversalProcPtr;
-
- CONST
- uppIPMNoteProcInfo* = $000037C0; (* PROCEDURE (4 byte param, 4 byte param, 1 byte param, 4 byte param); *)
-
- PROCEDURE NewIPMNoteProc*(userRoutine: IPMNoteProcPtr): IPMNoteUPP;
- (*$IF NOT GENERATINGCFM *)
- INLINE PASCAL $2E9F;
- (*$END*)
-
- PROCEDURE CallIPMNoteProc*(queue: IPMQueueRef; seqNum: IPMSeqNum; notificationType: Types.ByteParameter; userData: LONGINT; userRoutine: IPMNoteUPP);
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $205F, $4E90;
- (*$END*)
-
- TYPE
- IPMFixedHdrInfo* = RECORD
- version*: INTEGER;
- authenticated*: BOOLEAN;
- signatureEnclosed*: BOOLEAN; (* digital signature enclosed *)
- msgSize*: LONGINT;
- notification*: IPMNotificationType;
- priority*: IPMPriority;
- blockCount*: INTEGER;
- originalRcptCount*: INTEGER; (* original number of recipients *)
- refCon*: LONGINT; (* Client defined data *)
- reserved*: INTEGER;
- creationTime*: OCE.UTCTime; (* Sound.Time when it was created *)
- msgID*: IPMMsgID;
- family*: Types.OSType; (* family this msg belongs (e.g. mail) *)
- END;
-
-
- CONST
- kIPMDeliveryNotificationBit* = 0;
- kIPMNonDeliveryNotificationBit* = 1;
- kIPMEncloseOriginalBit* = 2;
- kIPMSummaryReportBit* = 3;
- (* modify enclose original to only on error *)
- kIPMOriginalOnlyOnErrorBit* = 4;
-
- kIPMNoNotificationMask* = $00;
- kIPMDeliveryNotificationMask* = ASH(1,kIPMDeliveryNotificationBit);
- kIPMNonDeliveryNotificationMask* = ASH(1,kIPMNonDeliveryNotificationBit);
- kIPMDontEncloseOriginalMask* = $00;
- kIPMEncloseOriginalMask* = ASH(1,kIPMEncloseOriginalBit);
- kIPMImmediateReportMask* = $00;
- kIPMSummaryReportMask* = ASH(1,kIPMSummaryReportBit);
- kIPMOriginalOnlyOnErrorMask* = ASH(1,kIPMOriginalOnlyOnErrorBit);
- kIPMEncloseOriginalOnErrorMask* = kIPMOriginalOnlyOnErrorMask + kIPMEncloseOriginalMask;
-
- kIPMNoSuchRecipient* = $0001;
- kIPMRecipientMalformed* = $0002;
- kIPMRecipientAmbiguous* = $0003;
- kIPMRecipientAccessDenied* = $0004;
- kIPMGroupExpansionProblem* = $0005;
- kIPMMsgUnreadable* = $0006;
- kIPMMsgExpired* = $0007;
- kIPMMsgNoTranslatableContent* = $0008;
- kIPMRecipientReqStdCont* = $0009;
- kIPMRecipientReqSnapShot* = $000A;
- kIPMNoTransferDiskFull* = $000B;
- kIPMNoTransferMsgRejectedbyDest* = $000C;
- kIPMNoTransferMsgTooLarge* = $000D;
-
- (*************************************************************************)
- (*
- This is the structure that will be returned by enumerate and getmsginfo
- This definition is just to give you a template, the position of msgType
- is variable since this is a packed structure. procHint and msgType are
- packed and even length padded.
-
- * master message info *)
-
- TYPE
- IPMMsgInfo* = RECORD
- sequenceNum*: IPMSeqNum;
- userData*: LONGINT;
- respIndex*: INTEGER;
- padByte*: Types.SInt8;
- priority*: IPMPriority;
- msgSize*: LONGINT;
- originalRcptCount*: INTEGER;
- reserved*: INTEGER;
- creationTime*: OCE.UTCTime;
- msgID*: IPMMsgID;
- family*: Types.OSType; (* family this msg belongs (e.g. mail) *)
- procHint*: IPMProcHint;
- filler2*: Types.SInt8;
- msgType*: IPMMsgType;
- END;
-
- IPMBlockType* = OCECreatorType;
-
- IPMTOC* = RECORD
- blockType*: IPMBlockType;
- blockOffset*: LONGINT;
- blockSize*: LONGINT;
- blockRefCon*: LONGINT;
- END;
-
- (*
- The following structure is just to describe the layout of the SingleFilter.
- Each field should be packed and word aligned when passed to the IPM ToolBox.
- *)
- IPMSingleFilter* = RECORD
- priority*: IPMPriority;
- padByte*: Types.SInt8;
- family*: Types.OSType; (* family this msg belongs (e.g. mail), '??POINTER TO for all *)
- script*: Types.ScriptCode; (* Language Identifier *)
- hint*: IPMProcHint;
- filler2*: Types.SInt8;
- msgType*: IPMMsgType;
- END;
-
- IPMFilter* = RECORD
- count*: INTEGER;
- sFilters*: ARRAY 1 (*ΔΔ[0..0]ΔΔ*) OF IPMSingleFilter;
- END;
-
- (*************************************************************************
- Following structures define the “start” of a recipient report block and the
- elements of the array respectively.
- *)
- IPMReportBlockHeader* = RECORD
- msgID*: IPMMsgID; (* message id of the original *)
- creationTime*: OCE.UTCTime; (* creation time of the report *)
- END;
-
- OCERecipientReport* = RECORD
- rcptIndex*: INTEGER; (* index of recipient in original message *)
- result*: Types.OSErr; (* result of sending letter to this recipient*)
- END;
-
- (*************************************************************************)
- IPMParamBlockPtr* = POINTER TO IPMParamBlock;
-
- IPMIOCompletionProcPtr* = (*ΔΔ Types.ProcPtr;*) PROCEDURE (paramBlock: IPMParamBlockPtr);
- IPMIOCompletionUPP* = Types.UniversalProcPtr;
-
- IPMOpenContextPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- contextRef*: IPMContextRef; (* <-- Context reference to be used in further calls*)
- END;
-
- IPMCloseContextPB* = IPMOpenContextPB;
-
- IPMCreateQueuePB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- filler1*: LONGINT;
- queue*: POINTER TO OCERecipient;
- identity*: OCEAuthDir.AuthIdentity; (* used only if queue is remote *)
- owner*: POINTER TO OCE.PackedRecordID; (* used only if queue is remote *)
- END;
-
- (* For createqueue and deletequeue only queue and identity are used *)
- IPMDeleteQueuePB* = IPMCreateQueuePB;
-
- IPMOpenQueuePB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- contextRef*: IPMContextRef;
- queue*: POINTER TO OCERecipient;
- identity*: OCEAuthDir.AuthIdentity;
- filter*: POINTER TO IPMFilter;
- newQueueRef*: IPMQueueRef;
- notificationProc*: IPMNoteUPP;
- userData*: LONGINT;
- noteType*: IPMNotificationType;
- padByte*: Types.SInt8; (* Types.Byte *)
- reserved*: LONGINT;
- reserved2*: LONGINT;
- END;
-
- IPMCloseQueuePB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- queueRef*: IPMQueueRef;
- END;
-
- IPMEnumerateQueuePB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- queueRef*: IPMQueueRef;
- startSeqNum*: IPMSeqNum;
- getProcHint*: BOOLEAN;
- getMsgType*: BOOLEAN;
- filler*: INTEGER;
- filter*: POINTER TO IPMFilter;
- numToGet*: INTEGER;
- numGotten*: INTEGER;
- enumCount*: LONGINT;
- enumBuffer*: Types.Ptr; (* will be packed array of IPMMsgInfo *)
- actEnumCount*: LONGINT;
- END;
-
- IPMChangeQueueFilterPB* = IPMEnumerateQueuePB;
-
- IPMDeleteMsgRangePB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- queueRef*: IPMQueueRef;
- startSeqNum*: IPMSeqNum;
- endSeqNum*: IPMSeqNum;
- lastSeqNum*: IPMSeqNum;
- END;
-
- IPMOpenMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- queueRef*: IPMQueueRef;
- sequenceNum*: IPMSeqNum;
- newMsgRef*: IPMMsgRef;
- actualSeqNum*: IPMSeqNum;
- exactMatch*: BOOLEAN;
- padByte*: Types.SInt8; (* Types.Byte *)
- reserved*: LONGINT;
- END;
-
- IPMOpenHFSMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- hfsPath*: POINTER TO Files.FSSpec;
- filler*: LONGINT;
- newMsgRef*: IPMMsgRef;
- filler2*: LONGINT;
- filler3*: Types.SInt8; (* Types.Byte *)
- filler4*: BOOLEAN;
- reserved*: LONGINT;
- END;
-
- IPMOpenBlockAsMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- filler*: LONGINT;
- newMsgRef*: IPMMsgRef;
- filler2*: ARRAY 7 (*ΔΔ[0..6]ΔΔ*) OF INTEGER;
- blockIndex*: INTEGER;
- END;
-
- IPMCloseMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- deleteMsg*: BOOLEAN;
- filler1*: BOOLEAN;
- END;
-
- IPMGetMsgInfoPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- info*: POINTER TO IPMMsgInfo;
- END;
-
- IPMReadHeaderPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- fieldSelector*: INTEGER;
- offset*: LONGINT;
- count*: LONGINT;
- buffer*: Types.Ptr;
- actualCount*: LONGINT;
- filler*: INTEGER;
- remaining*: LONGINT;
- END;
-
- IPMReadRecipientPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- rcptIndex*: INTEGER;
- offset*: LONGINT;
- count*: LONGINT;
- buffer*: Types.Ptr;
- actualCount*: LONGINT;
- reserved*: INTEGER; (* must be zero *)
- remaining*: LONGINT;
- originalIndex*: INTEGER;
- recipientOffsetFlags*: OCERecipientOffsetFlags;
- filler1*: BOOLEAN;
- END;
-
- (*
- replyQueue works like recipient. [can no longer read it via ReadHeader]
- OriginalIndex is meaningless, rcptFlags are used seperately and there are
- currently none defined.
- *)
- IPMReadReplyQueuePB* = IPMReadRecipientPB;
-
- IPMGetBlkIndexPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- blockType*: IPMBlockType;
- index*: INTEGER;
- startingFrom*: INTEGER;
- actualBlockType*: IPMBlockType;
- actualBlockIndex*: INTEGER;
- END;
-
- IPMReadMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- mode*: IPMAccessMode;
- offset*: LONGINT;
- count*: LONGINT;
- buffer*: Types.Ptr;
- actualCount*: LONGINT;
- blockIndex*: INTEGER;
- remaining*: LONGINT;
- END;
-
- IPMVerifySignaturePB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- signatureContext*: DigitalSignature.SIGContextPtr;
- END;
-
- IPMNewMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- filler*: LONGINT;
- recipient*: POINTER TO OCERecipient;
- replyQueue*: POINTER TO OCERecipient;
- procHint*: Types.StringPtr;
- filler2*: INTEGER;
- msgType*: POINTER TO IPMMsgType;
- refCon*: LONGINT;
- newMsgRef*: IPMMsgRef;
- filler3*: INTEGER;
- filler4*: LONGINT;
- identity*: OCEAuthDir.AuthIdentity;
- sender*: POINTER TO IPMSender;
- internalUse*: LONGINT;
- internalUse2*: LONGINT;
- END;
-
- IPMNewHFSMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- hfsPath*: POINTER TO Files.FSSpec;
- recipient*: POINTER TO OCERecipient;
- replyQueue*: POINTER TO OCERecipient;
- procHint*: Types.StringPtr;
- filler2*: INTEGER;
- msgType*: POINTER TO IPMMsgType;
- refCon*: LONGINT;
- newMsgRef*: IPMMsgRef;
- filler3*: INTEGER;
- filler4*: LONGINT;
- identity*: OCEAuthDir.AuthIdentity;
- sender*: POINTER TO IPMSender;
- internalUse*: LONGINT;
- internalUse2*: LONGINT;
- END;
-
- IPMNestMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- filler*: ARRAY 9 (*ΔΔ[0..8]ΔΔ*) OF INTEGER;
- refCon*: LONGINT;
- msgToNest*: IPMMsgRef;
- filler2*: INTEGER;
- startingOffset*: LONGINT;
- END;
-
- IPMNewNestedMsgBlockPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- recipient*: POINTER TO OCERecipient;
- replyQueue*: POINTER TO OCERecipient;
- procHint*: Types.StringPtr;
- filler1*: INTEGER;
- msgType*: POINTER TO IPMMsgType;
- refCon*: LONGINT;
- newMsgRef*: IPMMsgRef;
- filler2*: INTEGER;
- startingOffset*: LONGINT;
- identity*: OCEAuthDir.AuthIdentity;
- sender*: POINTER TO IPMSender;
- internalUse*: LONGINT;
- internalUse2*: LONGINT;
- END;
-
- IPMEndMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- msgID*: IPMMsgID;
- msgTitle*: POINTER TO OCE.RString;
- deliveryNotification*: IPMNotificationType;
- priority*: IPMPriority;
- cancel*: BOOLEAN;
- padByte*: Types.SInt8; (* Types.Byte *)
- reserved*: LONGINT;
- signature*: DigitalSignature.SIGSignaturePtr;
- signatureSize*: Memory.Size;
- signatureContext*: DigitalSignature.SIGContextPtr;
- (* family this msg belongs (e.g. mail) use kIPMFamilyUnspecified by default *)
- family*: Types.OSType;
- END;
-
- IPMAddRecipientPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- recipient*: POINTER TO OCERecipient;
- reserved*: LONGINT;
- END;
-
- IPMAddReplyQueuePB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- filler*: LONGINT;
- replyQueue*: POINTER TO OCERecipient;
- END;
-
- IPMNewBlockPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- blockType*: IPMBlockType;
- filler*: ARRAY 5 (*ΔΔ[0..4]ΔΔ*) OF INTEGER;
- refCon*: LONGINT;
- filler2*: ARRAY 3 (*ΔΔ[0..2]ΔΔ*) OF INTEGER;
- startingOffset*: LONGINT;
- END;
-
- IPMWriteMsgPB* = RECORD
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- msgRef*: IPMMsgRef;
- mode*: IPMAccessMode;
- offset*: LONGINT;
- count*: LONGINT;
- buffer*: Types.Ptr;
- actualCount*: LONGINT;
- currentBlock*: BOOLEAN;
- filler1*: BOOLEAN;
- END;
-
- IPMParamBlock* = RECORD
- (*ΔΔ CASE INTEGER OF
- 0: ( *)
- qLink*: Types.Ptr;
- reservedH1*: LONGINT;
- reservedH2*: LONGINT;
- ioCompletion*: IPMIOCompletionUPP;
- ioResult*: Types.OSErr;
- saveA5*: LONGINT;
- reqCode*: INTEGER;
- (*ΔΔ );
- 1: (
- openContextPB*: IPMOpenContextPB;
- );
- 2: (
- closeContextPB*: IPMCloseContextPB;
- );
- 3: (
- createQueuePB*: IPMCreateQueuePB;
- );
- 4: (
- deleteQueuePB*: IPMDeleteQueuePB;
- );
- 5: (
- openQueuePB*: IPMOpenQueuePB;
- );
- 6: (
- closeQueuePB*: IPMCloseQueuePB;
- );
- 7: (
- enumerateQueuePB*: IPMEnumerateQueuePB;
- );
- 8: (
- changeQueueFilterPB*: IPMChangeQueueFilterPB;
- );
- 9: (
- deleteMsgRangePB*: IPMDeleteMsgRangePB;
- );
- 10: (
- openMsgPB*: IPMOpenMsgPB;
- );
- 11: (
- openHFSMsgPB*: IPMOpenHFSMsgPB;
- );
- 12: (
- openBlockAsMsgPB*: IPMOpenBlockAsMsgPB;
- );
- 13: (
- closeMsgPB*: IPMCloseMsgPB;
- );
- 14: (
- getMsgInfoPB*: IPMGetMsgInfoPB;
- );
- 15: (
- readHeaderPB*: IPMReadHeaderPB;
- );
- 16: (
- readRecipientPB*: IPMReadRecipientPB;
- );
- 17: (
- readReplyQueuePB*: IPMReadReplyQueuePB;
- );
- 18: (
- getBlkIndexPB*: IPMGetBlkIndexPB;
- );
- 19: (
- readMsgPB*: IPMReadMsgPB;
- );
- 20: (
- verifySignaturePB*: IPMVerifySignaturePB;
- );
- 21: (
- newMsgPB*: IPMNewMsgPB;
- );
- 22: (
- newHFSMsgPB*: IPMNewHFSMsgPB;
- );
- 23: (
- nestMsgPB*: IPMNestMsgPB;
- );
- 24: (
- newNestedMsgBlockPB*: IPMNewNestedMsgBlockPB;
- );
- 25: (
- endMsgPB*: IPMEndMsgPB;
- );
- 26: (
- addRecipientPB*: IPMAddRecipientPB;
- );
- 27: (
- addReplyQueuePB*: IPMAddReplyQueuePB;
- );
- 28: (
- newBlockPB*: IPMNewBlockPB;
- );
- 29: (
- writeMsgPB*: IPMWriteMsgPB;
- );*)
- END;
-
- (* Request codes *)
-
- CONST
- kIPMOpenContext* = $400;
- kIPMCloseContext* = $401;
- kIPMNewMsg* = $402;
- kIPMAddRecipient* = $403;
- kIPMNewBlock* = $404;
- kIPMNewNestedMsgBlock* = $405;
- kIPMNestMsg* = $406;
- kIPMWriteMsg* = $407;
- kIPMEndMsg* = $408;
- kIPMOpenQueue* = $409;
- kIPMCloseQueue* = $40A;
- kIPMOpenMsg* = $40B;
- kIPMCloseMsg* = $40C;
- kIPMReadMsg* = $40D;
- kIPMReadHeader* = $40E;
- kIPMOpenBlockAsMsg* = $40F;
- kIPMReadRecipient* = $410;
- kIPMCreateQueue* = $411;
- kIPMDeleteQueue* = $412;
- kIPMEnumerateQueue* = $413;
- kIPMChangeQueueFilter* = $414;
- kIPMDeleteMsgRange* = $415;
- kIPMOpenHFSMsg* = $417;
- kIPMGetBlkIndex* = $418;
- kIPMGetMsgInfo* = $419;
- kIPMAddReplyQueue* = $41D;
- kIPMNewHFSMsg* = $41E;
- kIPMReadReplyQueue* = $421;
- kIPMVerifySignature* = $422;
-
- uppIPMIOCompletionProcInfo* = $000000C0; (* PROCEDURE (4 byte param); *)
-
- PROCEDURE CallIPMIOCompletionProc*(paramBlock: IPMParamBlockPtr; userRoutine: IPMIOCompletionUPP);
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $205F, $4E90;
- (*$END*)
-
- PROCEDURE NewIPMIOCompletionProc*(userRoutine: IPMIOCompletionProcPtr): IPMIOCompletionUPP;
- (*$IF NOT GENERATINGCFM *)
- INLINE PASCAL $2E9F;
- (*$END*)
-
- PROCEDURE IPMOpenContext*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $400, $AA5E;
- (*$END*)
- PROCEDURE IPMCloseContext*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $401, $AA5E;
- (*$END*)
- PROCEDURE IPMNewMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $402, $AA5E;
- (*$END*)
- PROCEDURE IPMNewBlock*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $404, $AA5E;
- (*$END*)
- PROCEDURE IPMNewNestedMsgBlock*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $405, $AA5E;
- (*$END*)
- PROCEDURE IPMNestMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $406, $AA5E;
- (*$END*)
- PROCEDURE IPMWriteMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $407, $AA5E;
- (*$END*)
- PROCEDURE IPMEndMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $408, $AA5E;
- (*$END*)
- PROCEDURE IPMOpenQueue*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $409, $AA5E;
- (*$END*)
- PROCEDURE IPMCloseQueue*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $40A, $AA5E;
- (*$END*)
- (* Always synchronous *)
- PROCEDURE IPMVerifySignature*(paramBlock: IPMParamBlockPtr): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $7000, $1f00, $3F3C, $422, $AA5E;
- (*$END*)
- PROCEDURE IPMOpenMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $40B, $AA5E;
- (*$END*)
- PROCEDURE IPMCloseMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $40C, $AA5E;
- (*$END*)
- PROCEDURE IPMReadMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $40D, $AA5E;
- (*$END*)
- PROCEDURE IPMReadHeader*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $40E, $AA5E;
- (*$END*)
- PROCEDURE IPMOpenBlockAsMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $40F, $AA5E;
- (*$END*)
- PROCEDURE IPMNewHFSMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $41E, $AA5E;
- (*$END*)
- PROCEDURE IPMReadRecipient*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $410, $AA5E;
- (*$END*)
- PROCEDURE IPMReadReplyQueue*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $421, $AA5E;
- (*$END*)
- PROCEDURE IPMCreateQueue*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $411, $AA5E;
- (*$END*)
- PROCEDURE IPMDeleteQueue*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $412, $AA5E;
- (*$END*)
- PROCEDURE IPMEnumerateQueue*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $413, $AA5E;
- (*$END*)
- PROCEDURE IPMChangeQueueFilter*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $414, $AA5E;
- (*$END*)
- PROCEDURE IPMDeleteMsgRange*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $415, $AA5E;
- (*$END*)
- PROCEDURE IPMAddRecipient*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $403, $AA5E;
- (*$END*)
- PROCEDURE IPMAddReplyQueue*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $41D, $AA5E;
- (*$END*)
- PROCEDURE IPMOpenHFSMsg*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $417, $AA5E;
- (*$END*)
- PROCEDURE IPMGetBlkIndex*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $418, $AA5E;
- (*$END*)
- PROCEDURE IPMGetMsgInfo*(paramBlock: IPMParamBlockPtr; async: BOOLEAN): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $3F3C, $419, $AA5E;
- (*$END*)
- (****************************************************************************************)
- (* EXTERNAL ROUTINES *)
-
- CONST
- kOCESizePackedRecipient* = 830;
- kOCEPackRecipient* = 831;
- kOCEUnpackRecipient* = 832;
- kOCEStreamRecipient* = 833;
- kOCEGetRecipientType* = 834;
- kOCESetRecipientType* = 835;
-
-
- PROCEDURE OCESizePackedRecipient*((*CONST*)VAR rcpt: OCERecipient): INTEGER;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $303C, 830, $AA5C;
- (*$END*)
- (*
- Take an OCERecipient (scatter) and (gather) stream into the specified
- buffer. It is assumed that there is sufficient space in the buffer (that is
- OCESizePackedRecipient). Safe to pass dereferenced handle(s).
- *)
- PROCEDURE OCEPackRecipient*((*CONST*)VAR rcpt: OCERecipient; buffer: (*ΔΔUNIVΔΔ*) Types.Ptr): INTEGER;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $303C, 831, $AA5C;
- (*$END*)
- (*
- Take a packed OCERecipient and cast a the OCERecipient frame over it. Returns
- amBadDestId if it doesn't look like an OCERecipient. Safe to pass dereferenced
- handle(s).
- *)
- PROCEDURE OCEUnpackRecipient*(buffer: (*ΔΔUNIVΔΔ*) Types.Ptr; VAR rcpt: OCERecipient; VAR entitySpecifier: OCE.RecordID): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $303C, 832, $AA5C;
- (*$END*)
- (*
- Take an OCERecipient (scatter) and (gather) stream using the specified
- function. Safe to pass dereferenced handle(s). If streamer function returns
- OCEError OCEStreamRecipient stops execution and passes the error back to the caller
- *)
- TYPE
- OCERecipientStreamerProcPtr* = (*ΔΔ Types.ProcPtr;*) PROCEDURE (buffer: (*ΔΔUNIVΔΔ*) Types.Ptr; count: LONGINT; eof: BOOLEAN; userData: LONGINT): Types.OSErr;
- OCERecipientStreamerUPP* = Types.UniversalProcPtr;
-
- CONST
- uppOCERecipientStreamerProcInfo* = $000037E0; (* PROCEDURE (4 byte param, 4 byte param, 1 byte param, 4 byte param): 2 byte result; *)
-
- PROCEDURE NewOCERecipientStreamerProc*(userRoutine: OCERecipientStreamerProcPtr): OCERecipientStreamerUPP;
- (*$IF NOT GENERATINGCFM *)
- INLINE PASCAL $2E9F;
- (*$END*)
-
- PROCEDURE CallOCERecipientStreamerProc*(buffer: (*ΔΔUNIVΔΔ*) Types.Ptr; count: LONGINT; eof: BOOLEAN; userData: LONGINT; userRoutine: OCERecipientStreamerUPP): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $205F, $4E90;
- (*$END*)
-
- TYPE
- OCERecipientStreamer* = OCERecipientStreamerUPP;
-
-
- PROCEDURE OCEStreamRecipient*((*CONST*)VAR rcpt: OCERecipient; stream: OCERecipientStreamer; userData: LONGINT; VAR actualCount: LONGINT): Types.OSErr;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $303C, 833, $AA5C;
- (*$END*)
- (* Get the OCERecipient's extensionType. Safe to pass dereferenced handle(s).*)
- PROCEDURE OCEGetRecipientType*((*CONST*)VAR cid: OCE.CreationID): Types.OSType;
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $303C, 834, $AA5C;
- (*$END*)
- (*
- Set the OCERecipient's extensionType in the specified cid. (Note: we do NOT
- check for a nil pointer). If the extensionType is LONG("entn"), the cid is assumed
- to be "valid" and is not touched. Note*: to properly handle non LONG("entn")'s this
- routine must and will zero the high long (source) of the cid! Safe to pass
- dereferenced handle(s).
- *)
- PROCEDURE OCESetRecipientType*(extensionType: Types.OSType; VAR cid: OCE.CreationID);
- (*$IF NOT GENERATINGCFM*)
- INLINE PASCAL $303C, 835, $AA5C;
- (*$END*)
-
- (* $ALIGN RESET*)
- (* $POP*)
-
- END OCEMessaging.
-